package com.feri.api.service.impl;

import com.feri.api.config.RedisKeyConfig;
import com.feri.api.config.SystemConfig;
import com.feri.api.dao.SmslogDao;

import com.feri.api.dto.PhoneCodeDto;
import com.feri.api.service.intf.SmslogService;
import com.feri.api.util.AliSmsUtil;
import com.feri.api.util.JedisUtil;
import com.feri.api.util.NumUtil;
import com.feri.api.vo.R;
import com.feri.common.entity.Smslog;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 学习强国
 * @Date: 2022/10/02 13:26:55
 */
@Service
public class SmslogServiceImpl implements SmslogService {
    @Resource
    private SmslogDao dao;

    @Override
    public R sendRCode(String phone) {
        int code = sendSmsCode(phone);
        if(code > 0){
            //发送成功,存储验证码 有效期10分钟
            //Redis,可以设置有效期 数据类型：String类型  key:  value:
            //4.存储验证码到Redis中
            JedisUtil.addString(RedisKeyConfig.USER_ADDCODE+phone,code+"",RedisKeyConfig.USER_ADDCODE_TIME);
            //5.记录日志
            dao.insert(new Smslog(phone,"发送注册验证码",1,1));
            return R.ok();
        }else {
            dao.insert(new Smslog(phone,"发送注册验证码",2,1));
            return R.fail("第三方短信平台故障!");
        }
    }



    @Override
    public R checkRCode(PhoneCodeDto dto) {
        //1.入参校验
        if(dto != null){
            if (StringUtils.hasLength(dto.getPhone())){
                //2.验证是否存在验证码
                String key = RedisKeyConfig.USER_ADDCODE +dto.getPhone();
                if (JedisUtil.exists(key)){
                    //3.比较验证码
                    if(JedisUtil.getString(key).equals(dto.getCode().toString())) {
                        //4.验证码正确，删除验证码
                        JedisUtil.delKey(key);
                        //5.记录校验验证码成功的手机号
                        JedisUtil.addSet(RedisKeyConfig.USER_ADDPHONES,dto.getPhone());
                        return R.ok("成功");
                    }else {return R.fail("验证码错误");}
                }else {return R.fail("验证码发送失败");}
            }else {return R.fail("请输入手机号");}
        }else {return R.fail("请输入验证码");}

    }

    @Override
    public R all() {
        return R.ok(dao.selectList(null));
    }

    @Override
    public R sendLCode(String phone) {
        int code = sendSmsCode(phone);
        if (code > 0) {
            //发送成功,存储验证码 有效期10分钟
            //Redis,可以设置有效期 数据类型：String类型  key:  value:
            //4.存储验证码到Redis中
            JedisUtil.addString(RedisKeyConfig.USER_LOGINCODE + phone, code + "", RedisKeyConfig.USER_LOGINCODE_TIME);
            //5.记录日志
            dao.insert(new Smslog(phone, "发送登录验证码", 1, 2));
            return R.ok();
        } else {
            dao.insert(new Smslog(phone, "发送登录验证码", 2, 2));
            return R.fail("第三方短信平台故障！");
        }
    }

    private int sendSmsCode(String phone){
        //1.校验
        if(StringUtils.hasLength(phone)){
            if(phone.matches(SystemConfig.PHONE_RX)){
                //2.生成随机验证码
                int code = NumUtil.createNum(6);
                //3.发送短信
                if (AliSmsUtil.sendCode(phone,code)){
                    System.out.println(code);
                    return code;
                }
            }
        }
        return 0;
    }
}